﻿#if !Rar2017_64bit
using nint = System.Int32;
using nuint = System.UInt32;
using size_t = System.UInt32;
#else
using nint = System.Int64;
using nuint = System.UInt64;
using size_t = System.UInt64;
#endif

#nullable disable

namespace SharpCompress.Compressors.Rar.UnpackV2017
{
    internal partial class BitInput
    {

        public BitInput(bool AllocBuffer)
        {
            ExternalBuffer = false;
            if (AllocBuffer)
            {
                // getbits32 attempts to read data from InAddr, ... InAddr+3 positions.
                // So let's allocate 3 additional bytes for situation, when we need to
                // read only 1 byte from the last position of buffer and avoid a crash
                // from access to next 3 bytes, which contents we do not need.
                size_t BufSize = MAX_SIZE + 3;
                InBuf = new byte[BufSize];

                // Ensure that we get predictable results when accessing bytes in area
                // not filled with read data.
                //memset(InBuf,0,BufSize);
            }
            else
            {
                InBuf = null;
            }
        }


        //BitInput::~BitInput()
        //{
        //    if (!ExternalBuffer)
        //    delete[] InBuf;
        //}
        //

        public
        void faddbits(uint Bits)
        {
            // Function wrapped version of inline addbits to save code size.
            addbits(Bits);
        }

        public
        uint fgetbits()
        {
            // Function wrapped version of inline getbits to save code size.
            return getbits();
        }

        private void SetExternalBuffer(byte[] Buf)
        {
            //if (InBuf!=NULL && !ExternalBuffer)
            //  delete[] InBuf;
            InBuf = Buf;
            ExternalBuffer = true;
        }

    }
}
